#ifndef __FIBER_HOOK_H__
#define __FIBER_HOOK_H__

// 包含必要的系统头文件，提供系统调用相关的类型和宏定义
#include <fcntl.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

// 拦截常见的系统调用（如网络操作、IO 操作、睡眠函数等）
// 并在启用 Hook 的情况下，将阻塞式操作转换为基于协程（Fiber）和 IO 管理器（IOManager）的非阻塞操作，以提升并发性能。

namespace fiber 
{
/**
 * @brief 判断当前线程是否启用了钩子功能
 * @return 若启用返回true，否则返回false
 */
bool is_hook_enable();

/**
 * @brief 设置当前线程的钩子启用状态
 * @param flag 为true时启用钩子，false时禁用
 */
void set_hook_enable(bool flag);
}  // namespace fiber

// 采用extern "C"保证C语言链接方式，避免C++名称修饰导致的链接问题
extern "C" {

// 睡眠相关系统调用的函数指针类型定义及外部声明
// 这些指针将指向原始系统调用或被钩子替换后的实现
typedef unsigned int (*sleep_fun)(unsigned int seconds);
extern sleep_fun sleep_f;  // sleep函数钩子指针

typedef int (*usleep_fun)(useconds_t usec);
extern usleep_fun usleep_f;  // usleep函数钩子指针

typedef int (*nanosleep_fun)(const struct timespec *req, struct timespec *rem);
extern nanosleep_fun nanosleep_f;  // nanosleep函数钩子指针

// 套接字相关系统调用的函数指针类型定义及外部声明
typedef int (*socket_fun)(int domain, int type, int protocol);
extern socket_fun socket_f;  // socket创建函数钩子指针

typedef int (*connect_fun)(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
extern connect_fun connect_f;  // 建立连接函数钩子指针

typedef int (*accept_fun)(int s, struct sockaddr *addr, socklen_t *addrlen);
extern accept_fun accept_f;  // 接受连接函数钩子指针

// 读操作相关系统调用的函数指针类型定义及外部声明
typedef ssize_t (*read_fun)(int fd, void *buf, size_t count);
extern read_fun read_f;  // 基础读操作钩子指针

typedef ssize_t (*readv_fun)(int fd, const struct iovec *iov, int iovcnt);
extern readv_fun readv_f;  // 分散读操作钩子指针

typedef ssize_t (*recv_fun)(int sockfd, void *buf, size_t len, int flags);
extern recv_fun recv_f;  // 套接字接收数据钩子指针

typedef ssize_t (*recvfrom_fun)(int sockfd, void *buf, size_t len, int flags, 
                                struct sockaddr *src_addr, socklen_t *addrlen);
extern recvfrom_fun recvfrom_f;  // 带源地址的套接字接收钩子指针

typedef ssize_t (*recvmsg_fun)(int sockfd, struct msghdr *msg, int flags);
extern recvmsg_fun recvmsg_f;  // 高级消息接收钩子指针

// 写操作相关系统调用的函数指针类型定义及外部声明
typedef ssize_t (*write_fun)(int fd, const void *buf, size_t count);
extern write_fun write_f;  // 基础写操作钩子指针

typedef ssize_t (*writev_fun)(int fd, const struct iovec *iov, int iovcnt);
extern writev_fun writev_f;  // 集中写操作钩子指针

typedef ssize_t (*send_fun)(int s, const void *msg, size_t len, int flags);
extern send_fun send_f;  // 套接字发送数据钩子指针

typedef ssize_t (*sendto_fun)(int s, const void *msg, size_t len, int flags, 
                              const struct sockaddr *to, socklen_t tolen);
extern sendto_fun sendto_f;  // 带目标地址的套接字发送钩子指针

typedef ssize_t (*sendmsg_fun)(int s, const struct msghdr *msg, int flags);
extern sendmsg_fun sendmsg_f;  // 高级消息发送钩子指针

// 文件描述符关闭操作钩子
typedef int (*close_fun)(int fd);
extern close_fun close_f;

// 其他IO操作相关钩子
typedef int (*fcntl_fun)(int fd, int cmd, ... /* arg */);
extern fcntl_fun fcntl_f;  // 文件控制操作钩子指针

typedef int (*ioctl_fun)(int d, unsigned long int request, ...);
extern ioctl_fun ioctl_f;  // IO控制操作钩子指针

// 套接字选项相关钩子
typedef int (*getsockopt_fun)(int sockfd, int level, int optname, 
                              void *optval, socklen_t *optlen);
extern getsockopt_fun getsockopt_f;  // 获取套接字选项钩子指针

typedef int (*setsockopt_fun)(int sockfd, int level, int optname, 
                              const void *optval, socklen_t optlen);
extern setsockopt_fun setsockopt_f;  // 设置套接字选项钩子指针

/**
 * @brief 带超时的连接函数
 * @param fd 套接字描述符
 * @param addr 目标地址结构
 * @param addrlen 地址长度
 * @param timeout_ms 超时时间（毫秒）
 * @return 成功返回0，失败返回-1并设置errno
 */
extern int connect_with_timeout(int fd, const struct sockaddr *addr, 
                                socklen_t addrlen, uint64_t timeout_ms);
}

#endif  // __FIBER_HOOK_H__